00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef _DETHREAD_HPP
00029 #define _DETHREAD_HPP
00030
00031 #ifndef _DENET_HPP
00032 #include "deNet.hpp"
00033 #endif
00034
00035 #ifndef _DESYNCHOBJECT_HPP
00036 #include "deSynchObject.hpp"
00037 #endif
00038
00039 #include <WINDOWS.H>
00040
00041 class deThreadPool;
00042
00043 class DENET_API deThread
00044 {
00045 public:
00046
00047
00048
00049
00050 enum eStatus
00051 {
00052 STATUS_UNKNOWN = -3,
00053 STATUS_NONE = -2,
00054 STATUS_SLEEP = -1,
00055 STATUS_RUN = 0,
00056 STATUS_WAKEUP,
00057 STATUS_STOP,
00058 STATUS_DEAD,
00059 STATUS_MAX_NUMBER,
00060 };
00061
00062 typedef DWORD (* ActiveProcess)( void * );
00063
00064 deThread();
00065 virtual ~deThread();
00066
00067 bool Start ( void );
00068 DWORD Stop ( bool bForceKill = false );
00069 void AttachProcess( ActiveProcess ptr, void * param );
00070 void DetachProcess(void);
00071 bool Sleep ( void );
00072 bool Wakeup( void );
00073
00074 DWORD GetExitCode();
00075 eStatus GetStatus(void) const;
00076
00077 protected:
00078
00079
00080
00081
00082 static DWORD WINAPI Run( LPVOID param );
00083
00084 protected:
00085
00086
00087
00088
00089 class ThreadContext
00090 {
00091 friend class deThread;
00092 public:
00093
00094 ThreadContext(void) : m_pParent(NULL), m_ProcessParam(NULL), m_AttachedProcess(NULL) { }
00095 virtual ~ThreadContext(void) { }
00096
00097 protected:
00098
00099 HANDLE m_hThread;
00100 DWORD m_dwTID;
00101 deThread * m_pParent;
00102 DWORD m_dwExitCode;
00103 HANDLE m_Events[STATUS_MAX_NUMBER];
00104 HANDLE m_ProcessChangeEvent;
00105 void * m_ProcessParam;
00106 ActiveProcess m_AttachedProcess;
00107 };
00108
00109 static deSynchObject m_SynchObject;
00110 eStatus m_Status;
00111 ThreadContext m_ThreadCtx;
00112 LPTHREAD_START_ROUTINE m_pThreadFunc;
00113 };
00114
00115 #endif